home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swagg_m.zip / INTERRUP.SWG / 0002_CLOCK1.PAS.pas < prev    next >
Pascal/Delphi Source File  |  1993-05-28  |  3KB  |  92 lines

  1. {
  2. CARLOS BEGUIGNE
  3. }
  4. Program ClockOnScreen;
  5.  
  6. {$R-,V-,S-,M 1024, 0, 0
  7.  
  8.   ClockOnScreen - Installs resident clock on upper right corner of screen.
  9.  
  10. {$IFOPT S+ }
  11.  
  12. {
  13.   You must disable stack checking here, since a Runtime error 202 will
  14.   be generated whenever the stack Pointer (as returned by SPtr) is likely
  15.   to drop below 1024.
  16. }
  17. Uses
  18.   Dos, Crt;
  19. Const
  20.   Offset       = $8E;    { Line 1, Column $8E/2 = 71 }
  21.   TimerTick    = $1C;                  { Timer interrupt }
  22.   black        = 0;
  23.   gray         = 7;
  24.   EnvSeg       = $002C;                { Segment of Dos environment }
  25.   ColourSeg    = $B800;                { Segment of colour video RAM }
  26.   MonoSeg      = $B000;                { Segment of monochrome ideo RAM }
  27.   CrtSegment   : Word = ColourSeg;
  28.  
  29. Type
  30.   ScreenArray  = Array[0..7] of Record
  31.     number, attribute : Char;
  32.   end;
  33.  
  34.   ScreenPtr    = ScreenArray;
  35.  
  36. Var
  37.   VideoMode    : Byte Absolute $0000:$0449;
  38.   Screen       : ^ScreenPtr;            { Physical screen address }
  39.   ClockColour  : Char;
  40.   Int1CSave    : Procedure;
  41.  
  42. Procedure ShowTime; Interrupt;
  43. Const
  44.   separator    = ':';
  45. Var
  46.   ThisMode     : Byte;
  47.   Time         : LongInt;
  48.   i            : Integer;
  49.   BIOSTicker   : LongInt Absolute $0000:$046C;
  50.  
  51.   Procedure DisplayDigit(offset : Integer; digit : Integer);
  52.   begin
  53.     Screen^ [offset].number := Chr(digit div 10+Ord('0'));
  54.     Screen^ [offset+1].number := Chr(digit mod 10+Ord('0'));
  55.   end;  { DisplayDigit }
  56.  
  57. begin
  58.   ThisMode := VideoMode;
  59.   if not ((ThisMode = 2) or (ThisMode = 3) or (ThisMode = 7)) Then
  60.     Exit;                              { Do not popup in a Graphic mode }
  61.   For i := 0 to 7 Do
  62.     Screen^[i].attribute := ClockColour;
  63.   Time := (1365*BIOSTicker) div 24852;
  64.   DisplayDigit(0, Time div 3600);      { hours }
  65.   Screen^[2].number := separator;
  66.   Time := Time mod 3600;
  67.   DisplayDigit(3, Time div 60);        { minutes }
  68.   Screen^[5].number := separator;
  69.   DisplayDigit(6, Time mod 60);        { seconds }
  70.   Inline($9C); { PUSHF }
  71.   Int1CSave;
  72. end;  { ShowTime }
  73.  
  74. Procedure Release(segment : Word);
  75. InLine(
  76.   $07/                 { POP   ES       ; get segment of block to release }
  77.   $B4/$49/             { MOV   AH, 49h  ; Free Allocated Memory }
  78.   $CD/$21);            { INT   21h      ; call Dos }
  79.  
  80. begin  { ClockOnScreen }
  81.   if VideoMode = 7 Then
  82.     CrtSegment := MonoSeg;
  83.   ClockColour := Chr(gray*16+black);      {display video attribute }
  84.   Screen := Ptr(CrtSegment, Offset);
  85.   GetIntVec(TimerTick, @Int1CSave);
  86.   SetIntVec(TimerTick, @ShowTime);
  87.   Release(MemW[PrefixSeg:EnvSeg]);        {Release the environment }
  88.   Keep(0);
  89.   readln;
  90. end.  { ClockOnScreen }
  91.  
  92.